Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

OpenXML και concurrency

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 19-12-2005, 21:28. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-12-2005, 19:07 8106

    OpenXML και concurrency

    Γεια σας και χαρά σας !!!
    Θέλω να δουλέψω με XML για να κάνω κάποιο update σε δύο related (Parent - Child) πίνακες στον SQL Server(2000)

    Τρέχω το εξής procedure :

    CREATE PROCEDURE UpdateXML
    @Parent ntext
    AS

    DECLARE @XMLHandler int, @ParentID bigint

    EXEC sp_xml_preparedocument @XMLHandler output, @Parent
    IF @@Error<>0
    BEGIN
     SELECT -1
     RETURN
    END

    BEGIN TRANSACTION

    SET @ParentID=(SELECT PId
        FROM OpenXML(@XMLHandler,'/Parent',1)   
                   WITH (PId bigint))

    IF @@Error<>0
    BEGIN
     ROLLBACK TRANSACTION
     SELECT -2
     RETURN
    END

    UPDATE tblChildren
    SET    
         Name = Cname      
         FROM OpenXML(@XMLHandler,'/Parent/Child',1)
                    WITH (Cid bigint, Cname nvarchar(50))
    WHERE  ParentId = @ParentId AND
       Id=Cid
      

    IF @@Error<>0
    BEGIN
     ROLLBACK TRANSACTION
     SELECT -3
     RETURN
    END

    COMMIT TRANSACTION

    exec sp_xml_removedocument @XMLHandler
    GO

     

    έτσι για παράδειγμα :

    uSE [tEST dATABASE]
    exec dbo.UpdateXML '<Parent PId="2">
          <Child Cname="TESTAdRA1" Cid="6"/>
          <Child Cname="TESdTARA2" Cid="7"/>
          <Child Cname="TESxTARA3" Cid="8"/>
          <Child Cname="TEScTARA4" Cid="9"/>
          <Child Cname="TESTxARA5" Cid="10"/>
         </Parent>'

    και δουλεύει μια χαρά ...


    Πως θα κάνω όμως handle το concurrency;(έχω προσθέσει timestamps και θα ήθελα το update να γίνεται rollback αν οποιοδήποτε πχ child rec έχει διαφοροποιηθεί από αυτό που πήρα πριν το update)


     


    Πάνος Αβραμίδης
  •  19-12-2005, 19:19 8108 σε απάντηση της 8106

    Απ: OpenXML και concurrency

     axaros wrote:

    UPDATE tblChildren
    SET    
         Name = Cname      
         FROM OpenXML(@XMLHandler,'/Parent/Child',1)
                    WITH (Cid bigint, Cname nvarchar(50))
    WHERE  ParentId = @ParentId AND
       Id=Cid

    Το παραπάνω θα πρέπει να είναι κάπως έτσι:

    UPDATE tblChildren
    SET    
         Name = Cname, LastUpdated=GETDATE()      
         FROM OpenXML(@XMLHandler,'/Parent/Child',1)
                    WITH (Cid bigint, Cname nvarchar(50), Ctimestamp datetime)
    WHERE  ParentId = @ParentId AND
       Id=Cid AND LastUpdated=Ctimestamp

    όπου LastUpdated η στήλη που κρατάς την τελευταία αλλαγή. Στη συνέχεια κοιτάς αν το @@ROWCOUNT είναι ίδιο με το πλήθος των Child elements που έχεις, και αν όχι, rollback.

     


    Νατάσα Μανουσοπούλου
  •  19-12-2005, 21:28 8115 σε απάντηση της 8108

    Απ: OpenXML και concurrency

    Mns σε ευχαριστώ.

    Να ρωτήσω και πάλι όμως όλους σας :
    Αυτό γιατί δουλεύει :

    UPDATE tblChildren
    SET
    Name = Cname
    FROM OpenXML(@XMLHandler,'/Parent/Child',1)
    WITH (Cid bigint, Cname nvarchar(50),Cts nvarchar(30))
    WHERE ParentId = @ParentId AND
    Id=Cid AND TS=CAST(CAST(Cts as int) as binary(8))

    Όπως και το :

    UPDATE tblChildren
    SET    
         Name = Cname      
         FROM OpenXML(@XMLHandler,'/Parent/Child',1)
                    WITH (Cid bigint, Cname nvarchar(50),Cts nvarchar(30))
    WHERE  ParentId = @ParentId AND
       Id=Cid AND TS=CAST(CAST(Cts as int) as timestamp)


    To SELECT (FOR XML) μου γυρνάει Integer ...
    Οπότε :

    exec dbo.UpdateXML '<Parent PId="1">
              <Child Cid="1" Cname="TESTUPDATE1" Cts="7442"/>
              <Child Cid="2" Cname="TESTUPDATE2" Cts="7443"/>
              <Child Cid="3" Cname="TESTUPDATE3" Cts="7444"/>
              <Child Cid="4" Cname="TESTUPDATE4" Cts="7445"/>
             <Child Cid="5" Cname="TESTUPDATE5" Cts="7446"/>
         </Parent>'

    Γιατί ;


    Πάνος Αβραμίδης
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems